SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
create Function [dbo].[FN_ValidaCedula] (@Cedula as varchar(11)) Returns int
AS
Begin
Declare @Numero as int
Declare @Unidad as int
Declare @Decena as int
Declare @Proxima as int
Declare @I as int
Declare @Base as int
Declare @Cantidad as int
Declare @Verificador as int
Declare @Cedula10 as varchar(10)
Declare @Resultado as int
If len(@Cedula) <> 11
Begin
    Return -1  -- Retorna -1 si la cedula esta incompleta
end
else
    Set @Cedula10 = substring(@Cedula, 1, 10)  -- Tomo las primeras 10 posiciones
    Set @Verificador = 0  -- Hago el Verificador = 0
    Set @I = 1  -- Inicializo I en 1
    While @I <= 10  -- Loop para evaluar los 10 digitos y multiplicarlos por la base 2*1*2*1*2*1*2*1*2*1*2*1
    Begin
        If (@I % 2) = 0
            Begin
                Set @Base = 2  -- Si son las posiciones 2,4,6,8,10 entonces base = 2
            end
        else
            Begin
                Set @Base = 1  -- Sin son las posiciones 1,3,5,7,9 entonces base = 1
            end
        Set @Numero = convert(int,substring(@Cedula10, @I,1)) * @Base -- Multiplicando cada digito por su base
        Set @Unidad = @Numero % 10 -- Tomando la Unidad del numero calculado
        Set @Decena = (@Numero - (@Numero % 10)) / 10   -- Tomando la decena del numero calculado
        Set @Verificador = @Verificador + (@Unidad + @Decena) -- Acumulando resultados
        Set @I = @I + 1  -- Incrementando I para proximo digito
    end
    If (@Verificador % 10) <> 0  -- Si la sumatoria final es multiplo de 10 se deja asi, sino se lleva la proxima decena
    Begin
        Set @Proxima = (@Verificador - (@Verificador % 10)) + 10
    end
    else
    Begin   
        Set @Proxima = @Verificador
    end
   
    Set @Verificador = @Proxima - @Verificador  -- Restar la proxima decena y el verificador
    if convert(int, substring(@Cedula, 11,1)) = @Verificador -- Comparar resultado con digito 11 de la cedula
    Begin
        Set @Resultado = 1  -- Se retorna 1 si la cedula es correcta
    end
    else
    Begin
        Set @Resultado = 0  -- Se retorna 0 si la cedula es incorrecta
    end
    Return @Resultado
/* ***********************************************************************************
Cedula        0    0    1    0    1    5    7    5    4    5    Check Digit 4
        *    *    *    *    *    *    *    *    *    *
        1    2    1    2    1    2    1    2    1    2
        =    =    =    =    =    =    =    =    =    =
        0    0    1    0    1    1+0    7    1+0    4    1+0  = 16
       
    Proxima Decena de 16 = 20, por lo tanto 20 - 16 = 4 lo que nos dice que esta correcta
****************************************************************************************************/
END
GO
